#!/usr/bin/env python
# encoding  : utf-8

import conexion_cliente
import os.path, os
import string
from constants import *


fraction_size = 1024

def quit(clie):

    """termina una conexion con un cliente"""
    #arma la confirmacion
    res = str(code_ok) + " " + error_messages[code_ok] + eol
    #envia la confirmacion
    error=clie.enviar_mensaje(res)
    #verifica si se envio
    if error < 0 : return -1
    #cierra la conexion
    clie.cerrar_conexion()
    #si llegamos hasta aca todo ocurrio con normalidad
    return code_ok



def get_metadata(clie, dire, arch):
    """ provee informacion sobre arch a clie """
    #verificamos si dire viene con "/" al final o no.
    if dire[-1]=="/" :
        path = dire + arch
    else :
        path = dire + "/" + arch
    #intentamos abrir el archivo
    try :
        f = open(path, "r")
        tam = os.path.getsize(path)
    except IOError:
    #si ocurre un error de I/O enviamos el error
        return file_not_found

    #armamos la confirmacion
    res = str(code_ok) + " " + error_messages[code_ok] + eol
    #enviamos la confirmacion
    error=clie.enviar_mensaje(res)
    if error < 0 : return -1
    #armamos la respuesta
    res=str(tam) + eol
    #enviamos la respuesta
    error=clie.enviar_mensaje(res)
    #verificamos el error
    if error < 0 : return -1
    #si llegamos hasta aca todo ocurrio con normalidad
    return code_ok



def get_file_listing (clie,dire):
    """ lista los archivos que estan en dire y se los envia a clie"""
    #verificamos si dire viene con "/" al final o no.
    if dire[-1]!="/"   : dire+="/"
    #armamos la confirmacion
    res = str(code_ok) + " " + error_messages[code_ok] + eol
    #armamos la lista de archivos compartidos
    lista=[]
    for root, dirs, file_list in os.walk(dire):
        lista=lista + file_list

    for f in lista:
        if f[0]!="."  :
            res = res + f + eol
    #terminacion especial de la respuesta
    res += eol
    #enviamos la respuesta
    error = clie.enviar_mensaje(res)
    #enviamos la respuesta
    if error < 0 : return -1
    #si llegamos hasta aca todo ocurrio con normalidad
    return code_ok



def get_slice(clie, dire, arch, off, lar):
    """ envia un trozo de arch comprendido entre off y lar a clie"""
    #verificamos si dire viene con "/" al final o no.
    if dire[-1]=="/" :
        path = dire + arch
    else :
        path = dire + "/" + arch
    #intentamos abrir y leer de arch
    try:
        f = open(path, "r")
        tam = os.path.getsize(path)
    #si hubo un error de I/O lo capturamos y devolvemos error
    except IOError:
        return file_not_found
    #verificamos que no haya problemas con el offset y largo
    ol = int(off) + int(lar)
    s = int(tam)
    if (ol > s or int(off) >= s): return bad_offset

    #armamos confirmacion
    res = str(code_ok) + " " + error_messages[code_ok] + eol
    #enviamos la confirmacion
    error=clie.enviar_mensaje(res)
    #verificamos error
    if error < 0 : return -1

    #indexamos el archivo
    f.seek(int(off))
    resto = int(lar)

    #armamos y enviamos respuestas
    while resto > 0:
        #armamos fragmento de igual tamanio
        res=""
        if resto >= fraction_size:
            data = f.read(fraction_size)
            res += str(fraction_size) + " " + data + eol
            error=clie.enviar_mensaje(res)
            if error < 0 : return -1
            resto -= fraction_size

        #el ante-ultimo fragmento de distinto tamanio
        else:
            data = f.read(resto)
            res += str(resto) + " " + data + eol
            error=clie.enviar_mensaje(res)
            if error < 0 : return -1
            resto = 0
    #ultimo fragmento de tamanio cero
    res = "0 " + eol
    #enviamos ultimo fragmento
    error=clie.enviar_mensaje(res)
    #verificamos error
    if error < 0 : return -1
    #si llegamos hasta aca todo ocurrio con normalidad
    return code_ok
